home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xmcd-1.4 / xmcd.d / help.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-10  |  15.5 KB  |  480 lines

  1. /*
  2.  *   xmcd - Motif(tm) CD Audio Player
  3.  *
  4.  *   Copyright (C) 1995  Ti Kan
  5.  *   E-mail: ti@amb.org
  6.  *
  7.  *   This program is free software; you can redistribute it and/or modify
  8.  *   it under the terms of the GNU General Public License as published by
  9.  *   the Free Software Foundation; either version 2 of the License, or
  10.  *   (at your option) any later version.
  11.  *
  12.  *   This program is distributed in the hope that it will be useful,
  13.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *   GNU General Public License for more details.
  16.  *
  17.  *   You should have received a copy of the GNU General Public License
  18.  *   along with this program; if not, write to the Free Software
  19.  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  */
  22. #ifndef LINT
  23. static char *_help_c_ident_ = "@(#)help.c    5.2 94/12/28";
  24. #endif
  25.  
  26. #define _XMINC_
  27.  
  28. #include "common.d/appenv.h"
  29. #include "xmcd.d/xmcd.h"
  30. #include "xmcd.d/widget.h"
  31. #include "xmcd.d/cdfunc.h"
  32. #include "xmcd.d/help.h"
  33.  
  34.  
  35. /* This structure is used to map widgets to associated help files.
  36.  * Instead of using XtName(), this mechanism allows us to map multiple
  37.  * widgets to a common help file.  Also, we can use arbitrary lengths
  38.  * for the widget name and still have help files with less than 14 chars
  39.  * in its name (necessary for compatibility with some systems).
  40.  */
  41. typedef struct {
  42.     Widget    widget;
  43.     char    *hlpname;
  44. } wname_t;
  45.  
  46.  
  47. extern appdata_t    app_data;
  48. extern widgets_t    widgets;
  49.  
  50. STATIC wname_t        wname[MAX_HELP_WIDGETS];
  51. STATIC char        tmpbuf[STR_BUF_SZ * 2];
  52.  
  53.  
  54. /***********************
  55.  *  internal routines  *
  56.  ***********************/
  57.  
  58. /*
  59.  * help_mapinit
  60.  *    Initialize the widget-to-helpfile_name mapping table.
  61.  *
  62.  * Args:
  63.  *    Nothing.
  64.  *
  65.  * Return:
  66.  *    Nothing.
  67.  */
  68. STATIC void
  69. help_mapinit(void)
  70. {
  71.     int    i = 0;
  72.  
  73.     wname[i].widget = widgets.main.check_box;
  74.     wname[i++].hlpname = "CheckBox";
  75.     wname[i].widget = widgets.main.eject_btn;
  76.     wname[i++].hlpname = "EjectBtn";
  77.     wname[i].widget = widgets.main.poweroff_btn;
  78.     wname[i++].hlpname = "PowerBtn";
  79.     wname[i].widget = widgets.main.dbprog_btn;
  80.     wname[i++].hlpname = "DbProgBtn";
  81.     wname[i].widget = widgets.main.options_btn;
  82.     wname[i++].hlpname = "OptionsBtn";
  83.     wname[i].widget = widgets.main.time_btn;
  84.     wname[i++].hlpname = "TimeBtn";
  85.     wname[i].widget = widgets.main.ab_btn;
  86.     wname[i++].hlpname = "AbBtn";
  87.     wname[i].widget = widgets.main.sample_btn;
  88.     wname[i++].hlpname = "SampleBtn";
  89.     wname[i].widget = widgets.main.keypad_btn;
  90.     wname[i++].hlpname = "KeypadBtn";
  91.     wname[i].widget = widgets.main.help_btn;
  92.     wname[i++].hlpname = "HelpBtn";
  93.     wname[i].widget = widgets.main.level_scale;
  94.     wname[i++].hlpname = "LevelScale";
  95.     wname[i].widget = widgets.main.playpause_btn;
  96.     wname[i++].hlpname = "PlayPauseBtn";
  97.     wname[i].widget = widgets.main.stop_btn;
  98.     wname[i++].hlpname = "StopBtn";
  99.     wname[i].widget = widgets.main.prevtrk_btn;
  100.     wname[i++].hlpname = "PrevTrkBtn";
  101.     wname[i].widget = widgets.main.nexttrk_btn;
  102.     wname[i++].hlpname = "NextTrkBtn";
  103.     wname[i].widget = widgets.main.previdx_btn;
  104.     wname[i++].hlpname = "PrevIdxBtn";
  105.     wname[i].widget = widgets.main.nextidx_btn;
  106.     wname[i++].hlpname = "NextIdxBtn";
  107.     wname[i].widget = widgets.main.rew_btn;
  108.     wname[i++].hlpname = "RewBtn";
  109.     wname[i].widget = widgets.main.ff_btn;
  110.     wname[i++].hlpname = "FfBtn";
  111.     wname[i].widget = widgets.main.track_ind;
  112.     wname[i++].hlpname = "TrackInd";
  113.     wname[i].widget = widgets.main.index_ind;
  114.     wname[i++].hlpname = "IndexInd";
  115.     wname[i].widget = widgets.main.time_ind;
  116.     wname[i++].hlpname = "TimeInd";
  117.     wname[i].widget = widgets.main.rptcnt_ind;
  118.     wname[i++].hlpname = "RptCntInd";
  119.     wname[i].widget = widgets.main.dbmode_ind;
  120.     wname[i++].hlpname = "DbModeInd";
  121.     wname[i].widget = widgets.main.progmode_ind;
  122.     wname[i++].hlpname = "ProgModeInd";
  123.     wname[i].widget = widgets.main.timemode_ind;
  124.     wname[i++].hlpname = "TimeModeInd";
  125.     wname[i].widget = widgets.main.playmode_ind;
  126.     wname[i++].hlpname = "PlayModeInd";
  127.     wname[i].widget = widgets.main.dtitle_ind;
  128.     wname[i++].hlpname = "DiscTitleInd";
  129.     wname[i].widget = widgets.main.ttitle_ind;
  130.     wname[i++].hlpname = "TrackTitleInd";
  131.     wname[i].widget = widgets.keypad.keypad_ind;
  132.     wname[i++].hlpname = "KeypadInd";
  133.     wname[i].widget = widgets.keypad.num_btn[0];
  134.     wname[i++].hlpname = "KpNumBtn";
  135.     wname[i].widget = widgets.keypad.num_btn[1];
  136.     wname[i++].hlpname = "KpNumBtn";
  137.     wname[i].widget = widgets.keypad.num_btn[2];
  138.     wname[i++].hlpname = "KpNumBtn";
  139.     wname[i].widget = widgets.keypad.num_btn[3];
  140.     wname[i++].hlpname = "KpNumBtn";
  141.     wname[i].widget = widgets.keypad.num_btn[4];
  142.     wname[i++].hlpname = "KpNumBtn";
  143.     wname[i].widget = widgets.keypad.num_btn[5];
  144.     wname[i++].hlpname = "KpNumBtn";
  145.     wname[i].widget = widgets.keypad.num_btn[6];
  146.     wname[i++].hlpname = "KpNumBtn";
  147.     wname[i].widget = widgets.keypad.num_btn[7];
  148.     wname[i++].hlpname = "KpNumBtn";
  149.     wname[i].widget = widgets.keypad.num_btn[8];
  150.     wname[i++].hlpname = "KpNumBtn";
  151.     wname[i].widget = widgets.keypad.num_btn[9];
  152.     wname[i++].hlpname = "KpNumBtn";
  153.     wname[i].widget = widgets.keypad.clear_btn;
  154.     wname[i++].hlpname = "KpClearBtn";
  155.     wname[i].widget = widgets.keypad.enter_btn;
  156.     wname[i++].hlpname = "KpEnterBtn";
  157.     wname[i].widget = widgets.keypad.warp_lbl;
  158.     wname[i++].hlpname = "KpWarpScale";
  159.     wname[i].widget = widgets.keypad.warp_scale;
  160.     wname[i++].hlpname = "KpWarpScale";
  161.     wname[i].widget = widgets.keypad.cancel_btn;
  162.     wname[i++].hlpname = "KpCancelBtn";
  163.     wname[i].widget = widgets.options.load_chkbox;
  164.     wname[i++].hlpname = "OpLoadChkBox";
  165.     wname[i].widget = widgets.options.load_radbox;
  166.     wname[i++].hlpname = "OpLoadRadBox";
  167.     wname[i].widget = widgets.options.exit_radbox;
  168.     wname[i++].hlpname = "OpExitRadBox";
  169.     wname[i].widget = widgets.options.done_chkbox;
  170.     wname[i++].hlpname = "OpDoneChkBox";
  171.     wname[i].widget = widgets.options.eject_chkbox;
  172.     wname[i++].hlpname = "OpEjectChkBox";
  173.     wname[i].widget = widgets.options.chroute_radbox;
  174.     wname[i++].hlpname = "OpChRtRadBox";
  175.     wname[i].widget = widgets.options.vol_radbox;
  176.     wname[i++].hlpname = "OpVolTprRadBox";
  177.     wname[i].widget = widgets.options.bal_lbl;
  178.     wname[i++].hlpname = "OpBalScale";
  179.     wname[i].widget = widgets.options.bal_scale;
  180.     wname[i++].hlpname = "OpBalScale";
  181.     wname[i].widget = widgets.options.ball_lbl;
  182.     wname[i++].hlpname = "OpBalScale";
  183.     wname[i].widget = widgets.options.balr_lbl;
  184.     wname[i++].hlpname = "OpBalScale";
  185.     wname[i].widget = widgets.options.balctr_btn;
  186.     wname[i++].hlpname = "OpBalCtrBtn";
  187.     wname[i].widget = widgets.options.reset_btn;
  188.     wname[i++].hlpname = "OpResetBtn";
  189.     wname[i].widget = widgets.options.ok_btn;
  190.     wname[i++].hlpname = "OpOkBtn";
  191.     wname[i].widget = widgets.dbprog.about_btn;
  192.     wname[i++].hlpname = "DpAboutBtn";
  193.     wname[i].widget = widgets.dbprog.dtitle_txt;
  194.     wname[i++].hlpname = "DpDTitleTxt";
  195.     wname[i].widget = widgets.dbprog.extd_btn;
  196.     wname[i++].hlpname = "DpDExtBtn";
  197.     wname[i].widget = widgets.dbprog.trk_list;
  198.     wname[i++].hlpname = "DpTrkList";
  199.     wname[i].widget = widgets.dbprog.addpgm_btn;
  200.     wname[i++].hlpname = "DpAddPgmBtn";
  201.     wname[i].widget = widgets.dbprog.clrpgm_btn;
  202.     wname[i++].hlpname = "DpClrPgmBtn";
  203.     wname[i].widget = widgets.dbprog.radio_box;
  204.     wname[i++].hlpname = "DpTimeSelBtn";
  205.     wname[i].widget = widgets.dbprog.discid_ind;
  206.     wname[i++].hlpname = "DiscIdInd";
  207.     wname[i].widget = widgets.dbprog.ttitle_txt;
  208.     wname[i++].hlpname = "DpTTitleTxt";
  209.     wname[i].widget = widgets.dbprog.extt_btn;
  210.     wname[i++].hlpname = "DpTExtBtn";
  211.     wname[i].widget = widgets.dbprog.pgmseq_txt;
  212.     wname[i++].hlpname = "DpPgmSeqTxt";
  213.     wname[i].widget = widgets.dbprog.send_btn;
  214.     wname[i++].hlpname = "DpSendBtn";
  215.     wname[i].widget = widgets.dbprog.savedb_btn;
  216.     wname[i++].hlpname = "DpSaveBtn";
  217.     wname[i].widget = widgets.dbprog.linkdb_btn;
  218.     wname[i++].hlpname = "DpLinkBtn";
  219.     wname[i].widget = widgets.dbprog.loaddb_btn;
  220.     wname[i++].hlpname = "DpLoadBtn";
  221.     wname[i].widget = widgets.dbprog.cancel_btn;
  222.     wname[i++].hlpname = "DpCancelBtn";
  223.     wname[i].widget = widgets.dbextd.disc_txt;
  224.     wname[i++].hlpname = "DdDiscTxt";
  225.     wname[i].widget = widgets.dbextd.ok_btn;
  226.     wname[i++].hlpname = "DdOkBtn";
  227.     wname[i].widget = widgets.dbextd.clear_btn;
  228.     wname[i++].hlpname = "DdClrBtn";
  229.     wname[i].widget = widgets.dbextd.cancel_btn;
  230.     wname[i++].hlpname = "DdCancelBtn";
  231.     wname[i].widget = widgets.dbextt.trk_txt;
  232.     wname[i++].hlpname = "DtTrackTxt";
  233.     wname[i].widget = widgets.dbextt.ok_btn;
  234.     wname[i++].hlpname = "DtOkBtn";
  235.     wname[i].widget = widgets.dbextt.clear_btn;
  236.     wname[i++].hlpname = "DtClrBtn";
  237.     wname[i].widget = widgets.dbextt.cancel_btn;
  238.     wname[i++].hlpname = "DtCancelBtn";
  239.     wname[i].widget = widgets.dirsel.dir_list;
  240.     wname[i++].hlpname = "DsDirList";
  241.     wname[i].widget = widgets.dirsel.ok_btn;
  242.     wname[i++].hlpname = "DsOkBtn";
  243.     wname[i].widget = widgets.dirsel.cancel_btn;
  244.     wname[i++].hlpname = "DsCancelBtn";
  245.     wname[i].widget = widgets.linksel.link_list;
  246.     wname[i++].hlpname = "LsLinkList";
  247.     wname[i].widget = widgets.linksel.ok_btn;
  248.     wname[i++].hlpname = "LsOkBtn";
  249.     wname[i].widget = widgets.linksel.cancel_btn;
  250.     wname[i++].hlpname = "LsCancelBtn";
  251.     wname[i].widget = (Widget) NULL;
  252.     wname[i].hlpname = NULL;
  253. }
  254.  
  255.  
  256. /*
  257.  * help_getname
  258.  *    Given a widget, return the associated help file name.
  259.  *
  260.  * Args:
  261.  *    w - The widget
  262.  *
  263.  * Return:
  264.  *    The help file name text string.
  265.  */
  266. STATIC char *
  267. help_getname(Widget w)
  268. {
  269.     int    i;
  270.  
  271.     for (i = 0; wname[i].widget != NULL; i++) {
  272.         if (w == wname[i].widget)
  273.             return (wname[i].hlpname);
  274.     }
  275.     return NULL;
  276. }
  277.  
  278.  
  279. /***********************
  280.  *   public routines   *
  281.  ***********************/
  282.  
  283.  
  284. /*
  285.  * help_setup
  286.  *    Top level function to set up the help subsystem.
  287.  *
  288.  * Args:
  289.  *    Nothing.
  290.  *
  291.  * Return:
  292.  *    Nothing.
  293.  */
  294. void
  295. help_setup(widgets_t *m)
  296. {
  297.     int        i;
  298.     char        xlat_str[40];
  299.     XtTranslations    xtab1,
  300.             xtab2;
  301.  
  302.     sprintf(xlat_str, "<Btn3Down>,<Btn3Up>: Help()\n");
  303.     xtab1 = XtParseTranslationTable(xlat_str);
  304.     sprintf(xlat_str, "<Btn3Down>,<Btn3Up>: PrimitiveHelp()\n");
  305.     xtab2 = XtParseTranslationTable(xlat_str);
  306.  
  307.     /* Translations for the main window widgets */
  308.     XtOverrideTranslations(m->main.check_box, xtab1);
  309.     XtOverrideTranslations(m->main.eject_btn, xtab1);
  310.     XtOverrideTranslations(m->main.poweroff_btn, xtab1);
  311.     XtOverrideTranslations(m->main.track_ind, xtab1);
  312.     XtOverrideTranslations(m->main.index_ind, xtab1);
  313.     XtOverrideTranslations(m->main.time_ind, xtab1);
  314.     XtOverrideTranslations(m->main.rptcnt_ind, xtab1);
  315.     XtOverrideTranslations(m->main.dbmode_ind, xtab1);
  316.     XtOverrideTranslations(m->main.progmode_ind, xtab1);
  317.     XtOverrideTranslations(m->main.timemode_ind, xtab1);
  318.     XtOverrideTranslations(m->main.playmode_ind, xtab1);
  319.     XtOverrideTranslations(m->main.dtitle_ind, xtab1);
  320.     XtOverrideTranslations(m->main.ttitle_ind, xtab1);
  321.     XtOverrideTranslations(m->main.dbprog_btn, xtab1);
  322.     XtOverrideTranslations(m->main.options_btn, xtab1);
  323.     XtOverrideTranslations(m->main.time_btn, xtab1);
  324.     XtOverrideTranslations(m->main.ab_btn, xtab1);
  325.     XtOverrideTranslations(m->main.sample_btn, xtab1);
  326.     XtOverrideTranslations(m->main.keypad_btn, xtab1);
  327.     XtOverrideTranslations(m->main.help_btn, xtab1);
  328.     XtOverrideTranslations(m->main.level_scale, xtab1);
  329.     XtOverrideTranslations(m->main.playpause_btn, xtab1);
  330.     XtOverrideTranslations(m->main.stop_btn, xtab1);
  331.     XtOverrideTranslations(m->main.previdx_btn, xtab1);
  332.     XtOverrideTranslations(m->main.nextidx_btn, xtab1);
  333.     XtOverrideTranslations(m->main.prevtrk_btn, xtab1);
  334.     XtOverrideTranslations(m->main.nexttrk_btn, xtab1);
  335.     XtOverrideTranslations(m->main.rew_btn, xtab1);
  336.     XtOverrideTranslations(m->main.ff_btn, xtab1);
  337.  
  338.     /* Translations for the keypad window widgets */
  339.     XtOverrideTranslations(m->keypad.keypad_ind, xtab1);
  340.     for (i = 0; i < 10; i++)
  341.         XtOverrideTranslations(m->keypad.num_btn[i], xtab1);
  342.     XtOverrideTranslations(m->keypad.clear_btn, xtab1);
  343.     XtOverrideTranslations(m->keypad.enter_btn, xtab1);
  344.     XtOverrideTranslations(m->keypad.warp_lbl, xtab1);
  345.     XtOverrideTranslations(m->keypad.warp_scale, xtab1);
  346.     XtOverrideTranslations(m->keypad.cancel_btn, xtab1);
  347.  
  348.     /* Translations for the options window widgets */
  349.     XtOverrideTranslations(m->options.load_chkbox, xtab1);
  350.     XtOverrideTranslations(m->options.load_radbox, xtab1);
  351.     XtOverrideTranslations(m->options.exit_radbox, xtab1);
  352.     XtOverrideTranslations(m->options.done_chkbox, xtab1);
  353.     XtOverrideTranslations(m->options.eject_chkbox, xtab1);
  354.     XtOverrideTranslations(m->options.chroute_radbox, xtab1);
  355.     XtOverrideTranslations(m->options.vol_radbox, xtab1);
  356.     XtOverrideTranslations(m->options.bal_lbl, xtab1);
  357.     XtOverrideTranslations(m->options.bal_scale, xtab1);
  358.     XtOverrideTranslations(m->options.ball_lbl, xtab1);
  359.     XtOverrideTranslations(m->options.balr_lbl, xtab1);
  360.     XtOverrideTranslations(m->options.balctr_btn, xtab1);
  361.     XtOverrideTranslations(m->options.reset_btn, xtab1);
  362.     XtOverrideTranslations(m->options.ok_btn, xtab1);
  363.  
  364.     /* Translations for the dbprog window widgets */
  365.     XtOverrideTranslations(m->dbprog.about_btn, xtab1);
  366.     XtOverrideTranslations(m->dbprog.dtitle_txt, xtab1);
  367.     XtOverrideTranslations(m->dbprog.extd_btn, xtab1);
  368.     XtOverrideTranslations(m->dbprog.trk_list, xtab2);
  369.     XtOverrideTranslations(m->dbprog.radio_box, xtab1);
  370.     XtOverrideTranslations(m->dbprog.discid_ind, xtab1);
  371.     XtOverrideTranslations(m->dbprog.ttitle_txt, xtab1);
  372.     XtOverrideTranslations(m->dbprog.extt_btn, xtab1);
  373.     XtOverrideTranslations(m->dbprog.addpgm_btn, xtab1);
  374.     XtOverrideTranslations(m->dbprog.clrpgm_btn, xtab1);
  375.     XtOverrideTranslations(m->dbprog.pgmseq_txt, xtab1);
  376.     XtOverrideTranslations(m->dbprog.send_btn, xtab1);
  377.     XtOverrideTranslations(m->dbprog.savedb_btn, xtab1);
  378.     XtOverrideTranslations(m->dbprog.linkdb_btn, xtab1);
  379.     XtOverrideTranslations(m->dbprog.loaddb_btn, xtab1);
  380.     XtOverrideTranslations(m->dbprog.cancel_btn, xtab1);
  381.  
  382.     /* Translations for the extd window widgets */
  383.     XtOverrideTranslations(m->dbextd.disc_txt, xtab1);
  384.     XtOverrideTranslations(m->dbextd.ok_btn, xtab1);
  385.     XtOverrideTranslations(m->dbextd.clear_btn, xtab1);
  386.     XtOverrideTranslations(m->dbextd.cancel_btn, xtab1);
  387.  
  388.     /* Translations for the extt window widgets */
  389.     XtOverrideTranslations(m->dbextt.trk_txt, xtab1);
  390.     XtOverrideTranslations(m->dbextt.ok_btn, xtab1);
  391.     XtOverrideTranslations(m->dbextt.clear_btn, xtab1);
  392.     XtOverrideTranslations(m->dbextt.cancel_btn, xtab1);
  393.  
  394.     /* Translations for the dirsel window widgets */
  395.     XtOverrideTranslations(m->dirsel.dir_list, xtab2);
  396.     XtOverrideTranslations(m->dirsel.ok_btn, xtab1);
  397.     XtOverrideTranslations(m->dirsel.cancel_btn, xtab1);
  398.  
  399.     /* Translations for the linksel window widgets */
  400.     XtOverrideTranslations(m->linksel.link_list, xtab2);
  401.     XtOverrideTranslations(m->linksel.ok_btn, xtab1);
  402.     XtOverrideTranslations(m->linksel.cancel_btn, xtab1);
  403.  
  404.     /* Initialize helpfile mappings */
  405.     help_mapinit();
  406. }
  407.  
  408.  
  409. /*
  410.  * help_popup
  411.  *    Pop up the help window and display appropriate help text.
  412.  *
  413.  * Args:
  414.  *    w - The widget which the help info is being displayed about.
  415.  *
  416.  * Return:
  417.  *    Nothing.
  418.  */
  419. void
  420. help_popup(Widget w)
  421. {
  422.     char        hlpfile[FILE_PATH_SZ],
  423.             *hlpname;
  424.     FILE        *fp;
  425.     static char    *helptext = NULL;
  426.  
  427.     if ((hlpname = help_getname(w)) == NULL)
  428.         return;
  429.  
  430.     sprintf(hlpfile, "%s/help/%s", app_data.libdir, hlpname);
  431.  
  432.     if ((fp = fopen(hlpfile, "r")) == NULL) {
  433.         /* Can't read help file on this widget */
  434.         XmTextSetString(widgets.help.help_txt, app_data.str_nohelp);
  435.         XtManageChild(widgets.help.form);
  436.  
  437.         return;
  438.     }
  439.  
  440.     if (helptext != NULL) {
  441.         MEM_FREE(helptext);
  442.         helptext = NULL;
  443.     }
  444.  
  445.     while (fgets(tmpbuf, sizeof(tmpbuf), fp) != NULL) {
  446.         if (tmpbuf[0] == '#')
  447.             /* Comment */
  448.             continue;
  449.  
  450.         if (helptext == NULL) {
  451.             helptext = (char *) MEM_ALLOC(strlen(tmpbuf) + 1);
  452.  
  453.             if (helptext != NULL)
  454.                 *helptext = '\0';
  455.         }
  456.         else {
  457.             helptext = (char *) MEM_REALLOC(
  458.                 helptext,
  459.                 strlen(helptext) + strlen(tmpbuf) + 1
  460.             );
  461.         }
  462.  
  463.         if (helptext == NULL) {
  464.             cd_fatal_popup(
  465.                 app_data.str_fatal,
  466.                 app_data.str_nomemory
  467.             );
  468.         }
  469.  
  470.         strcat(helptext, tmpbuf);
  471.     }
  472.  
  473.     fclose(fp);
  474.  
  475.     XmTextSetString(widgets.help.help_txt, helptext);
  476.     XtManageChild(widgets.help.form);
  477. }
  478.  
  479.  
  480.